<?php
/**
 * Este modelo tiene la estructura de datos para mantener el formulario de login.
 * Es usado por el controlador 'LoginController'.
 * 
 * @package Users
 * @author j.m.j.s. (24/07/2009)
 */
class UsersLoginForm extends CFormModel
{
	public $username;
	public $password;
	public $rememberMe;
	public $verifyCode;
	public $rijndaelKey;
	public $cookieKey;

	/**
	 * Declares the validation rules.
	 * The rules state that username and password are required,
	 * and password needs to be authenticated.
	 * 
	 * @author j.m.j.s. (24/07/2009)
	 * @author j.m.j.s. (15/01/2010)
	 */
	public function rules()
	{
		return array(
			// username and password are required
			array('username, password', 'required'),
			// El check de 'Recuerdame la próxima vez' debe tener un valor numerico o ser vacio
			array('rememberMe', 'boolean'),
			// verifyCode needs to be entered correctly
			array('verifyCode', 'captcha', 'on'=>'formWithCapcha'),
			array('verifyCode', 'length', 'min'=>6, 'max'=>7),
			// password needs to be authenticated
			array('password', 'authenticate'),
		);
	}

	/**
	 * Declares attribute labels.
	 */
	public function attributeLabels()
	{
		return array(
			'username'=>'Usuario',
			'password'=>'Contraseña',
			'rememberMe'=>'Recuerdame la próxima vez',
			'verifyCode'=>'Código de verificación',
		);
	}

	/**
	 * Verifica la autenticidad del usuario y la contraseña.
	 * Esta es la validación 'authenticate' que fue declarada en rules().
	 * 
	 * @author j.m.j.s. (24/07/2009)
	 */
	public function authenticate($attribute,$params)
	{
		if(!$this->hasErrors())  // we only want to authenticate when no input errors
		{
			$identity=new UsersIdentity($this->username,$this->password);
			$identity->rijndaelKey = $this->rijndaelKey;
			$identity->authenticate();
			switch($identity->errorCode)
			{
				case UsersIdentity::ERROR_NONE:
					$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
					$this->createCookie($duration);
					Yii::app()->user->login($identity,0);
					break;
				case UsersIdentity::ERROR_USERNAME_INVALID:
					$this->addError('username','El usuario es incorrecto.');
					break;
				default: // UsersIdentity::ERROR_PASSWORD_INVALID
					$this->addError('password','La contraseña es incorrecta.');
					break;
			}
		}
	}
	
	/**
	 * En esta función se crea la cookie con los datos de login y password encriptados
	 * 
	 * @param $duration - Si el usuario checkeo "Recuerdame la próxima vez" entonces la duración será 30 dias, de lo contrario será cero.
	 * @author j.m.j.s. (23/07/2009)
	 */
	public function createCookie($duration)
	{
        $rijndael = new RijndaelHex($this->rijndaelKey);
		$cryptLogin = $rijndael->linencrypthexComplex($this->username, $this->password);
        $cryptPassword = $rijndael->linencrypthexComplex($this->password, $this->username);
		setcookie($this->cookieKey."-qfdr4uc", $cryptLogin, time()+$duration, "/");
		setcookie($this->cookieKey."-qpdr3w", $cryptPassword, time()+$duration, "/");
	}
}
